#pragma once
#include "util.hpp"
#include "level.hpp"
#include "formatter.hpp"
#include "logsink.hpp"
#include "logger.hpp"
#include "buffer.hpp"
#include <vector>
#include <fstream>
#include"../extend_func/extend.hpp"//自主更改路径
/*
 简化用户使用日志操作的文件（使用的时候只需要包含它即可）

*/

// 自定义日志器：
Logger::lptr GetLogger(const std::string name)
{
    return Loggermanager::Getinstance().Getlogger(name);
}

// 默认的root日志器（全默认行为）

Logger::lptr Getroot()
{
    return Loggermanager::Getinstance().Getroot();
}

// 自动定义日志器简化调用接口：(如果用户输入日志器名称就要x--->#x)

#define Debug(fmt, ...) Debug(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define Info(fmt, ...) Info(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define Warn(fmt, ...) Warn(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define Error(fmt, ...) Error(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define Fatal(fmt, ...) Fatal(__FILE__, __LINE__, fmt, ##__VA_ARGS__)

// 默认输出日志器简化接口：

#define DEBUG(fmt, ...) Getroot()->Debug(fmt, ##__VA_ARGS__)
#define INFO(fmt, ...) Getroot()->Info(fmt, ##__VA_ARGS__)
#define WARN(fmt, ...) Getroot()->Warn(fmt, ##__VA_ARGS__)
#define ERROR(fmt, ...) Getroot()->Error(fmt, ##__VA_ARGS__)
#define FATAL(fmt, ...) Getroot()->Fatal(fmt, ##__VA_ARGS__)

// 基于指挥者模式改造：

class Rollbytimesink;
enum class Timegap;
class LoggerDirector
{
    public:
    LoggerDirector() : _gptr(std::make_shared<Globalloggerbuilder>()) {}


    void CreateLogger_Nondefault(const std::string name, Loggertype t1, AsyncIsSafe t2,
                                 const std::string format, Level::LevelType l)
    {
        _gptr->Buildloggername(name);  // 日志器名称
        _gptr->Buildloggertype(t1);    // 日志器类型（同步还是异步）
        _gptr->Buildloopertype(t2);    // 异步日志器才能选择的是缓冲区安全版本还是不安全版本 --->对应会不会一直阻塞 但是扩容并未开启--> 不安全版本：以时间模拟的空间  相当于扩容
        _gptr->Buildformmater(format); // 日志输出格式
        _gptr->Buildlimitlevel(l);     // 日志等级（只会输出高于它的日志）
    }

    void CreateLogger_Default()
    {
        //root+SYNC+stdout+debug
    }

    // 落地方式选择，只有非默认需要

    void Stdout()
    {

        _gptr->Buildlogsinks<Stdoutsink>();
        _gptr->Build();
    }
    void Fileout(std::string name)
    {
        _gptr->Buildlogsinks<Filesink>(name);
        _gptr->Build();

    }

    void Rollfileout(std::string name, size_t size)
    {

        _gptr->Buildlogsinks<Rollfilesink>(name, size);
        _gptr->Build();

    }
    void Rollbytimeout(std::string name, Timegap t)
    {

        _gptr->Buildlogsinks<Rollbytimesink>(name, t);
        _gptr->Build();

    }

private:
    Loggerbuilder::ptr _gptr;
};
